Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder -- this will be in the project root directory
# Use this as the root directory to ensure proper sourcing of functions 
# no matter where this is called from
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal")
results_dir <- file.path(analysis_dir, "results")
input_dir <- file.path(analysis_dir, "input")
files_dir <- file.path(root_dir, "analyses", "sample-distribution-analysis", "results")

# Input files
pbta_file <- file.path(files_dir, "pbta.tsv") # file from add-sample-distribution module
genomic_paired_file <- file.path(files_dir, "genomic_assays_matched_time_points.tsv")
tmb_vaf_file <- file.path(results_dir, "tmb_vaf_genomic.tsv")
palette_file <- file.path(root_dir, "figures", "palettes", "oncoprint_color_palette.tsv")

# File path to plot directory
plots_dir <-
  file.path(analysis_dir, "plots", "Alteration_type_barplots_matched_samples")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(root_dir, "/figures/scripts/theme.R"))
source(paste0(analysis_dir, "/util/function-create-barplot.R"))

Read in data and process

# Vector to order timepoints
timepoints <- c("Diagnosis", "Progressive", "Recurrence", "xDeceased", "Second Malignancy", "Unavailable")

pbta_df <- readr::read_tsv(pbta_file, guess_max = 100000, show_col_types = FALSE) %>% 
  select(Kids_First_Participant_ID, Kids_First_Biospecimen_ID, cg_multiple, cg_id, cgGFAC, tumor_descriptor)

tmb_vaf_df <- readr::read_tsv(tmb_vaf_file, guess_max = 100000, show_col_types = FALSE) %>% 
  filter(!tmb >= 10) %>% 
  select(Kids_First_Biospecimen_ID, Variant_Classification, gene_protein, mutation_count,   region_size, tmb, VAF)

genomic_paired_df <- readr::read_tsv(genomic_paired_file, guess_max = 100000, show_col_types = FALSE) %>%
  left_join(pbta_df, by = c("Kids_First_Participant_ID")) %>% 
  left_join(tmb_vaf_df, by = c("Kids_First_Biospecimen_ID")) %>%
  filter(!is.na(tmb))

no_samples_with_tmb <- print(length(unique(genomic_paired_df$Kids_First_Participant_ID)))
[1] 116
# Attention as some bs specimen might not have TMB.
# If that happens, we will end up with samples lacking timepoints.
# Let's identify these samples and remove them for now.

df <- genomic_paired_df %>%
  select(Kids_First_Participant_ID, tumor_descriptor) %>% 
  unique() %>%
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  summarize(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>%
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence", "Second Malignancy", "Unavailable", "Deceased", "Progressive;Progressive")) %>%
  left_join(genomic_paired_df, by = c("Kids_First_Participant_ID")) %>%
  filter(!cg_id == "NA") %>% 
  mutate(tumor_descriptor = case_when(grepl("Deceased", tumor_descriptor) ~ "xDeceased",
                               TRUE ~ tumor_descriptor),
         match_id = paste(tumor_descriptor, Kids_First_Participant_ID, sep = "_"),
         cg_id = str_replace(cg_id, "/", "_"),
         cg_id = str_replace(cg_id, "-", "_"),
         cg_id = str_replace_all(cg_id, " ", "_"),
         tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `tumor_descriptor = fct_relevel(tumor_descriptor, timepoints)`.
Caused by warning:
! 1 unknown level in `f`: Unavailable
no_samples <- print(length(unique(df$Kids_First_Participant_ID)))
[1] 107
# Let's count number of samples 
count_df <- df %>% 
  group_by(tumor_descriptor, cg_id, Kids_First_Participant_ID, match_id, Variant_Classification) %>% 
  dplyr::count(cg_id) 

Define parameters for plots

# Read color palette
palette_df <- readr::read_tsv(palette_file, guess_max = 100000, show_col_types = FALSE) 

# Define and order palette
palette <- palette_df$hex_codes
names(palette) <- palette_df$color_names

Alterations per timepoint

# Define parameters for function
x_value <- count_df$tumor_descriptor
title <- paste("Variant types in PBTA cohort", sep = " ")

# Run function
fname <- paste0(plots_dir, "/", "Alteration_type_timepoints_barplots.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Alteration_type_timepoints_barplots.pdf"
p <- create_stacked_barplot_variant(count_df = count_df, x = x_value, palette = palette, title = title)
pdf(file = fname, width = 6, height = 6)
print(p)
dev.off()
quartz_off_screen 
                2 

Alterations per timepoint in each cancer type

# Define parameters for function
x_value <- count_df$tumor_descriptor
title <- paste("Variant types in PBTA cohort across cancer groups", sep = " ")
rows <- 5

# Run function
fname <- paste0(plots_dir, "/", "Alteration_type_timepoints_cg_id_barplots.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Alteration_type_timepoints_cg_id_barplots.pdf"
p <- create_stacked_barplot_variant_cg_id(count_df = count_df, x = x_value, palette = palette, title = title, rows = rows)
pdf(file = fname, width = 25, height = 30)
print(p)
dev.off()
quartz_off_screen 
                2 

Alterations per timepoint in each cancer type and kids_id

sample <- as.character(unique(count_df$cg_id)) 
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Adamantinomatous_Craniopharyngioma"       "Atypical_Teratoid_Rhabdoid_Tumor"         "Chordoma"                                
 [4] "Choroid_plexus_carcinoma"                 "CNS_Embryonal_tumor"                      "Craniopharyngioma"                       
 [7] "Diffuse_midline_glioma"                   "Dysembryoplastic_neuroepithelial_tumor"   "Embryonal_tumor_with_multilayer_rosettes"
[10] "Ependymoma"                               "Ewing_sarcoma"                            "Ganglioglioma"                           
[13] "Glial_neuronal_tumor"                     "Hemangioblastoma"                         "High_grade_glioma"                       
[16] "Low_grade_glioma"                         "Malignant_peripheral_nerve_sheath_tumor"  "Medulloblastoma"                         
[19] "Meningioma"                               "Neuroblastoma"                            "Neurofibroma_Plexiform"                  
[22] "Pilocytic_astrocytoma"                    "Schwannoma"                              
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- count_df %>%
      filter(cg_id == sample[i])
  
  if (i %in% c(2,7,10, 15,16,18)){
    width_value = 25
    }else{
    width_value = 10
      }

  # Define parameters for function
  x_value <- df_sub$tumor_descriptor
  title <- paste(sample[i], "Variants across samples", sep = ": ")
  rows <- 1
  
  # Run function
  fname <- paste0(plots_dir, "/", sample[i], "-Alteration_type_timepoints_kids_barplots.pdf")
  print(fname)
  p <- create_stacked_barplot_variant_kids(count_df = df_sub, x = x_value, palette = palette, title = title, rows = rows)
  pdf(file = fname, width = width_value, height = 6)
  print(p)
  dev.off()
  }
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Adamantinomatous_Craniopharyngioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Atypical_Teratoid_Rhabdoid_Tumor-Alteration_type_timepoints_kids_barplots.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Chordoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Choroid_plexus_carcinoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/CNS_Embryonal_tumor-Alteration_type_timepoints_kids_barplots.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Craniopharyngioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Diffuse_midline_glioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Dysembryoplastic_neuroepithelial_tumor-Alteration_type_timepoints_kids_barplots.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Embryonal_tumor_with_multilayer_rosettes-Alteration_type_timepoints_kids_barplots.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Ependymoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Ewing_sarcoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Ganglioglioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Glial_neuronal_tumor-Alteration_type_timepoints_kids_barplots.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Hemangioblastoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/High_grade_glioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Low_grade_glioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Malignant_peripheral_nerve_sheath_tumor-Alteration_type_timepoints_kids_barplots.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Medulloblastoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Meningioma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Neuroblastoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Neurofibroma_Plexiform-Alteration_type_timepoints_kids_barplots.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Pilocytic_astrocytoma-Alteration_type_timepoints_kids_barplots.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_matched_samples/Schwannoma-Alteration_type_timepoints_kids_barplots.pdf"

Alterations per timepoint in each cancer type and timepoint model

tm_df_plot <- df %>%
  filter(!is.na(timepoints_models)) %>% 
  group_by(tumor_descriptor, cg_id, timepoints_models, match_id, Variant_Classification) %>% 
  dplyr::count(cg_id)

sample <- as.character(unique(tm_df_plot$timepoints_models))
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Dx-Dec"         "Dx-Pro"         "Dx-Pro-Dec"     "Dx-Pro-Rec"     "Dx-Pro-Rec-Dec" "Dx-Rec"         "Dx-Rec-Dec"     "Dx-SM"         
 [9] "Pro-Dec"        "Pro-Rec"        "Pro-Rec-Dec"    "Rec-Dec"        "Rec-SM"        
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- tm_df_plot %>%
      filter(timepoints_models == sample[i])
  
  # Define parameters for function
  x_value <- df_sub$tumor_descriptor
  title <- paste(sample[i])
  
  if (i %in% c(1,2,6)){
    rows <- 2
    }else{
      rows <- 1
      }
  
  # Run function
  p <- create_stacked_barplot_variant_cg_id(count_df = df_sub, x = x_value, palette = palette, title = title, rows = rows)
  
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.5.2

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] flextable_0.9.2 ggthemes_4.2.4  lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0   dplyr_1.1.2     purrr_1.0.1     readr_2.1.4    
 [9] tidyr_1.3.0     tibble_3.2.1    ggplot2_3.4.2   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] sass_0.4.7              bit64_4.0.5             vroom_1.6.3             jsonlite_1.8.7          carData_3.0-5          
 [6] bslib_0.5.0             shiny_1.7.4.1           askpass_1.2.0           fontLiberation_0.1.0    yaml_2.3.7             
[11] gdtools_0.3.3           pillar_1.9.0            backports_1.4.1         glue_1.6.2              uuid_1.1-0             
[16] digest_0.6.33           promises_1.2.0.1        ggsignif_0.6.4          colorspace_2.1-0        htmltools_0.5.5        
[21] httpuv_1.6.11           gfonts_0.2.0            fontBitstreamVera_0.1.1 pkgconfig_2.0.3         httpcode_0.3.0         
[26] broom_1.0.5             xtable_1.8-4            scales_1.2.1            later_1.3.1             officer_0.6.2          
[31] fontquiver_0.2.1        tzdb_0.4.0              openssl_2.1.0           timechange_0.2.0        generics_0.1.3         
[36] farver_2.1.1            car_3.1-2               ellipsis_0.3.2          ggpubr_0.6.0            cachem_1.0.8           
[41] withr_2.5.0             cli_3.6.1               magrittr_2.0.3          crayon_1.5.2            mime_0.12              
[46] evaluate_0.21           fansi_1.0.4             xml2_1.3.5              rstatix_0.7.2           textshaping_0.3.6      
[51] tools_4.2.3             data.table_1.14.8       hms_1.1.3               lifecycle_1.0.3         munsell_0.5.0          
[56] zip_2.3.0               compiler_4.2.3          jquerylib_0.1.4         systemfonts_1.0.4       rlang_1.1.1            
[61] rstudioapi_0.15.0       labeling_0.4.2          rmarkdown_2.23          gtable_0.3.3            abind_1.4-5            
[66] curl_5.0.2              R6_2.5.1                knitr_1.43              fastmap_1.1.1           bit_4.0.5              
[71] utf8_1.2.3              rprojroot_2.0.3         ragg_1.2.5              stringi_1.7.12          parallel_4.2.3         
[76] crul_1.4.0              Rcpp_1.0.11             vctrs_0.6.3             tidyselect_1.2.0        xfun_0.39              
LS0tCnRpdGxlOiAiQ2xhc3NpZmljYXRpb24gb2YgVmFyaWFudHMgYWNyb3NzIHBhaXJlZCBsb25naXR1ZGluYWwgc2FtcGxlcyBpbiB0aGUgUEJUQSBDb2hvcnQiCmF1dGhvcjogJ0FudG9uaWEgQ2hyb25pIDxjaHJvbmlhQGNob3AuZWR1PiBmb3IgRDNCJwpkYXRlOiAiMjAyMyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQotLS0KCiMgU2V0IHVwCmBgYHtyIGxvYWQtbGlicmFyeX0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKfSkKYGBgCgojIERpcmVjdG9yaWVzIGFuZCBGaWxlIElucHV0cy9PdXRwdXRzCmBgYHtyIHNldC1kaXItYW5kLWZpbGUtbmFtZXN9CiMgRGV0ZWN0IHRoZSAiLmdpdCIgZm9sZGVyIC0tIHRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeQojIFVzZSB0aGlzIGFzIHRoZSByb290IGRpcmVjdG9yeSB0byBlbnN1cmUgcHJvcGVyIHNvdXJjaW5nIG9mIGZ1bmN0aW9ucyAKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbQpyb290X2RpciA8LSBycHJvanJvb3Q6OmZpbmRfcm9vdChycHJvanJvb3Q6Omhhc19kaXIoIi5naXQiKSkKYW5hbHlzaXNfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImFuYWx5c2VzIiwgInRtYi12YWYtbG9uZ2l0dWRpbmFsIikKcmVzdWx0c19kaXIgPC0gZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgInJlc3VsdHMiKQppbnB1dF9kaXIgPC0gZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgImlucHV0IikKZmlsZXNfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImFuYWx5c2VzIiwgInNhbXBsZS1kaXN0cmlidXRpb24tYW5hbHlzaXMiLCAicmVzdWx0cyIpCgojIElucHV0IGZpbGVzCnBidGFfZmlsZSA8LSBmaWxlLnBhdGgoZmlsZXNfZGlyLCAicGJ0YS50c3YiKSAjIGZpbGUgZnJvbSBhZGQtc2FtcGxlLWRpc3RyaWJ1dGlvbiBtb2R1bGUKZ2Vub21pY19wYWlyZWRfZmlsZSA8LSBmaWxlLnBhdGgoZmlsZXNfZGlyLCAiZ2Vub21pY19hc3NheXNfbWF0Y2hlZF90aW1lX3BvaW50cy50c3YiKQp0bWJfdmFmX2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAidG1iX3ZhZl9nZW5vbWljLnRzdiIpCnBhbGV0dGVfZmlsZSA8LSBmaWxlLnBhdGgocm9vdF9kaXIsICJmaWd1cmVzIiwgInBhbGV0dGVzIiwgIm9uY29wcmludF9jb2xvcl9wYWxldHRlLnRzdiIpCgojIEZpbGUgcGF0aCB0byBwbG90IGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiLCAiQWx0ZXJhdGlvbl90eXBlX2JhcnBsb3RzX21hdGNoZWRfc2FtcGxlcyIpCmlmICghZGlyLmV4aXN0cyhwbG90c19kaXIpKSB7CiAgZGlyLmNyZWF0ZShwbG90c19kaXIpCn0KCnNvdXJjZShwYXN0ZTAocm9vdF9kaXIsICIvZmlndXJlcy9zY3JpcHRzL3RoZW1lLlIiKSkKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtYmFycGxvdC5SIikpCmBgYAoKIyBSZWFkIGluIGRhdGEgYW5kIHByb2Nlc3MKCmBgYHtyIGxvYWQtcHJvY2Vzcy1pbnB1dHN9CiMgVmVjdG9yIHRvIG9yZGVyIHRpbWVwb2ludHMKdGltZXBvaW50cyA8LSBjKCJEaWFnbm9zaXMiLCAiUHJvZ3Jlc3NpdmUiLCAiUmVjdXJyZW5jZSIsICJ4RGVjZWFzZWQiLCAiU2Vjb25kIE1hbGlnbmFuY3kiLCAiVW5hdmFpbGFibGUiKQoKcGJ0YV9kZiA8LSByZWFkcjo6cmVhZF90c3YocGJ0YV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAKICBzZWxlY3QoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgY2dfbXVsdGlwbGUsIGNnX2lkLCBjZ0dGQUMsIHR1bW9yX2Rlc2NyaXB0b3IpCgp0bWJfdmFmX2RmIDwtIHJlYWRyOjpyZWFkX3Rzdih0bWJfdmFmX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lIAogIGZpbHRlcighdG1iID49IDEwKSAlPiUgCiAgc2VsZWN0KEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIFZhcmlhbnRfQ2xhc3NpZmljYXRpb24sIGdlbmVfcHJvdGVpbiwgbXV0YXRpb25fY291bnQsCXJlZ2lvbl9zaXplLCB0bWIsIFZBRikKCmdlbm9taWNfcGFpcmVkX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihnZW5vbWljX3BhaXJlZF9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JQogIGxlZnRfam9pbihwYnRhX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQiKSkgJT4lIAogIGxlZnRfam9pbih0bWJfdmFmX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh0bWIpKQoKbm9fc2FtcGxlc193aXRoX3RtYiA8LSBwcmludChsZW5ndGgodW5pcXVlKGdlbm9taWNfcGFpcmVkX2RmJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCiMgQXR0ZW50aW9uIGFzIHNvbWUgYnMgc3BlY2ltZW4gbWlnaHQgbm90IGhhdmUgVE1CLgojIElmIHRoYXQgaGFwcGVucywgd2Ugd2lsbCBlbmQgdXAgd2l0aCBzYW1wbGVzIGxhY2tpbmcgdGltZXBvaW50cy4KIyBMZXQncyBpZGVudGlmeSB0aGVzZSBzYW1wbGVzIGFuZCByZW1vdmUgdGhlbSBmb3Igbm93LgoKZGYgPC0gZ2Vub21pY19wYWlyZWRfZGYgJT4lCiAgc2VsZWN0KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JSAKICB1bmlxdWUoKSAlPiUKICBhcnJhbmdlKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JQogIGdyb3VwX2J5KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpICU+JQogIHN1bW1hcml6ZSh0dW1vcl9kZXNjcmlwdG9yX3N1bSA9IHN0cl9jKHR1bW9yX2Rlc2NyaXB0b3IsIGNvbGxhcHNlID0gIjsiKSkgJT4lCiAgZmlsdGVyKCF0dW1vcl9kZXNjcmlwdG9yX3N1bSAlaW4lIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIiwgIlNlY29uZCBNYWxpZ25hbmN5IiwgIlVuYXZhaWxhYmxlIiwgIkRlY2Vhc2VkIiwgIlByb2dyZXNzaXZlO1Byb2dyZXNzaXZlIikpICU+JQogIGxlZnRfam9pbihnZW5vbWljX3BhaXJlZF9kZiwgYnkgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIikpICU+JQogIGZpbHRlcighY2dfaWQgPT0gIk5BIikgJT4lIAogIG11dGF0ZSh0dW1vcl9kZXNjcmlwdG9yID0gY2FzZV93aGVuKGdyZXBsKCJEZWNlYXNlZCIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gInhEZWNlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gdHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIG1hdGNoX2lkID0gcGFzdGUodHVtb3JfZGVzY3JpcHRvciwgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgc2VwID0gIl8iKSwKICAgICAgICAgY2dfaWQgPSBzdHJfcmVwbGFjZShjZ19pZCwgIi8iLCAiXyIpLAogICAgICAgICBjZ19pZCA9IHN0cl9yZXBsYWNlKGNnX2lkLCAiLSIsICJfIiksCiAgICAgICAgIGNnX2lkID0gc3RyX3JlcGxhY2VfYWxsKGNnX2lkLCAiICIsICJfIiksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCB0aW1lcG9pbnRzKSkKCm5vX3NhbXBsZXMgPC0gcHJpbnQobGVuZ3RoKHVuaXF1ZShkZiRLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSkpCgojIExldCdzIGNvdW50IG51bWJlciBvZiBzYW1wbGVzIApjb3VudF9kZiA8LSBkZiAlPiUgCiAgZ3JvdXBfYnkodHVtb3JfZGVzY3JpcHRvciwgY2dfaWQsIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIG1hdGNoX2lkLCBWYXJpYW50X0NsYXNzaWZpY2F0aW9uKSAlPiUgCiAgZHBseXI6OmNvdW50KGNnX2lkKSAKCmBgYCAKCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIHBsb3RzCgpgYGB7ciBkZWZpbmUtcGFyYW1ldGVycy1mb3ItcGxvdHN9CiMgUmVhZCBjb2xvciBwYWxldHRlCnBhbGV0dGVfZGYgPC0gcmVhZHI6OnJlYWRfdHN2KHBhbGV0dGVfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAKCiMgRGVmaW5lIGFuZCBvcmRlciBwYWxldHRlCnBhbGV0dGUgPC0gcGFsZXR0ZV9kZiRoZXhfY29kZXMKbmFtZXMocGFsZXR0ZSkgPC0gcGFsZXR0ZV9kZiRjb2xvcl9uYW1lcwpgYGAKCiMgQWx0ZXJhdGlvbnMgcGVyIHRpbWVwb2ludAoKYGBge3IgcGxvdC10aW1lcG9pbnQsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA2LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeF92YWx1ZSA8LSBjb3VudF9kZiR0dW1vcl9kZXNjcmlwdG9yCnRpdGxlIDwtIHBhc3RlKCJWYXJpYW50IHR5cGVzIGluIFBCVEEgY29ob3J0Iiwgc2VwID0gIiAiKQoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiQWx0ZXJhdGlvbl90eXBlX3RpbWVwb2ludHNfYmFycGxvdHMucGRmIikKcHJpbnQoZm5hbWUpCnAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdF92YXJpYW50KGNvdW50X2RmID0gY291bnRfZGYsIHggPSB4X3ZhbHVlLCBwYWxldHRlID0gcGFsZXR0ZSwgdGl0bGUgPSB0aXRsZSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSA2LCBoZWlnaHQgPSA2KQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIEFsdGVyYXRpb25zIHBlciB0aW1lcG9pbnQgaW4gZWFjaCBjYW5jZXIgdHlwZQoKYGBge3IgcGxvdC1jZy1pZCwgZmlnLndpZHRoID0gMjUsIGZpZy5oZWlnaHQgPSAzMCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnhfdmFsdWUgPC0gY291bnRfZGYkdHVtb3JfZGVzY3JpcHRvcgp0aXRsZSA8LSBwYXN0ZSgiVmFyaWFudCB0eXBlcyBpbiBQQlRBIGNvaG9ydCBhY3Jvc3MgY2FuY2VyIGdyb3VwcyIsIHNlcCA9ICIgIikKcm93cyA8LSA1CgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJBbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19jZ19pZF9iYXJwbG90cy5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90X3ZhcmlhbnRfY2dfaWQoY291bnRfZGYgPSBjb3VudF9kZiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93cykKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMzApCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIEFsdGVyYXRpb25zIHBlciB0aW1lcG9pbnQgaW4gZWFjaCBjYW5jZXIgdHlwZSBhbmQga2lkc19pZAoKYGBge3IgcGxvdC1jZy1pZC1raWRzLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQpzYW1wbGUgPC0gYXMuY2hhcmFjdGVyKHVuaXF1ZShjb3VudF9kZiRjZ19pZCkpIApzYW1wbGUgPC0gc29ydChzYW1wbGUsIGRlY3JlYXNpbmcgPSBGQUxTRSkKc2FtcGxlCgoKIyBMb29wIHRocm91Z2ggdmFyaWFibGUKZm9yIChpIGluIHNlcV9hbG9uZyhzYW1wbGUpKXsKICBwcmludChpKQogIGRmX3N1YiA8LSBjb3VudF9kZiAlPiUKICAgICAgZmlsdGVyKGNnX2lkID09IHNhbXBsZVtpXSkKICAKICBpZiAoaSAlaW4lIGMoMiw3LDEwLCAxNSwxNiwxOCkpewogICAgd2lkdGhfdmFsdWUgPSAyNQogICAgfWVsc2V7CiAgICB3aWR0aF92YWx1ZSA9IDEwCiAgICAgIH0KCiAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICB4X3ZhbHVlIDwtIGRmX3N1YiR0dW1vcl9kZXNjcmlwdG9yCiAgdGl0bGUgPC0gcGFzdGUoc2FtcGxlW2ldLCAiVmFyaWFudHMgYWNyb3NzIHNhbXBsZXMiLCBzZXAgPSAiOiAiKQogIHJvd3MgPC0gMQogIAogICMgUnVuIGZ1bmN0aW9uCiAgZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCBzYW1wbGVbaV0sICItQWx0ZXJhdGlvbl90eXBlX3RpbWVwb2ludHNfa2lkc19iYXJwbG90cy5wZGYiKQogIHByaW50KGZuYW1lKQogIHAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdF92YXJpYW50X2tpZHMoY291bnRfZGYgPSBkZl9zdWIsIHggPSB4X3ZhbHVlLCBwYWxldHRlID0gcGFsZXR0ZSwgdGl0bGUgPSB0aXRsZSwgcm93cyA9IHJvd3MpCiAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSB3aWR0aF92YWx1ZSwgaGVpZ2h0ID0gNikKICBwcmludChwKQogIGRldi5vZmYoKQogIH0KCmBgYAoKIyBBbHRlcmF0aW9ucyBwZXIgdGltZXBvaW50IGluIGVhY2ggY2FuY2VyIHR5cGUgYW5kIHRpbWVwb2ludCBtb2RlbAoKYGBge3IgcGxvdC10aW1lcG9pbnQtbW9kZWwsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQp0bV9kZl9wbG90IDwtIGRmICU+JQogIGZpbHRlcighaXMubmEodGltZXBvaW50c19tb2RlbHMpKSAlPiUgCiAgZ3JvdXBfYnkodHVtb3JfZGVzY3JpcHRvciwgY2dfaWQsIHRpbWVwb2ludHNfbW9kZWxzLCBtYXRjaF9pZCwgVmFyaWFudF9DbGFzc2lmaWNhdGlvbikgJT4lIAogIGRwbHlyOjpjb3VudChjZ19pZCkKCnNhbXBsZSA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtX2RmX3Bsb3QkdGltZXBvaW50c19tb2RlbHMpKQpzYW1wbGUgPC0gc29ydChzYW1wbGUsIGRlY3JlYXNpbmcgPSBGQUxTRSkKc2FtcGxlCgojIExvb3AgdGhyb3VnaCB2YXJpYWJsZQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZSkpewogIHByaW50KGkpCiAgZGZfc3ViIDwtIHRtX2RmX3Bsb3QgJT4lCiAgICAgIGZpbHRlcih0aW1lcG9pbnRzX21vZGVscyA9PSBzYW1wbGVbaV0pCiAgCiAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICB4X3ZhbHVlIDwtIGRmX3N1YiR0dW1vcl9kZXNjcmlwdG9yCiAgdGl0bGUgPC0gcGFzdGUoc2FtcGxlW2ldKQogIAogIGlmIChpICVpbiUgYygxLDIsNikpewogICAgcm93cyA8LSAyCiAgICB9ZWxzZXsKICAgICAgcm93cyA8LSAxCiAgICAgIH0KICAKICAjIFJ1biBmdW5jdGlvbgogIHAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdF92YXJpYW50X2NnX2lkKGNvdW50X2RmID0gZGZfc3ViLCB4ID0geF92YWx1ZSwgcGFsZXR0ZSA9IHBhbGV0dGUsIHRpdGxlID0gdGl0bGUsIHJvd3MgPSByb3dzKQogIAp9CmBgYAoKCmBgYHtyIGVjaG89VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAK